# 1. 给定一个列表[3,9,12,35,5,7,10],将列表里的数字按从大到小排序。可以使用自带方法，还需要自己写出一种方法。

# 方法1，使用自带方法排序
def sort_list(src: list, reverse=True):
    return sorted(src, reverse=reverse)


print(sort_list([1, 2, 3, 5, 0, 9, 1, 4]))


# 方法2，冒泡排序法

# 依次比较两个相领两个元素的值
# 每一次外循环得到一个最大值或者最小值
# 内循环是比较的次数，如果数组的长度为3，第一次外循环，内循环循环3-1次后后拿到最大值，第二次外循环，内循环只需要循环3-1-1次即可
# 设置一个标识，如果发生交换则继续，如果某一次没有发生交换则证明是目标序列，所以直接返回

def sort_list(src: list, reverse=True):
    for i in range(len(src) - 1):
        for j in range(len(src) - i - 1):
            flag = True
            if reverse:
                if src[j] < src[j + 1]:
                    src[j + 1], src[j] = src[j], src[j + 1]
                    flag = False
            elif not reverse:
                if src[j] > src[j + 1]:
                    src[j + 1], src[j] = src[j], src[j + 1]

            if flag:
                return src

    return src


print(sort_list([1, 2, 3, 4, 5, 6]))


# 方法3，插入排序
# 类似于洗牌，拿到一张牌后在有序区寻找自己的位置，插入后后面的元素跟着移动即可。
# 外循环的次数取决于需要多少张牌

# [3,2,1]

def insertion_sort(src: list):
    for i in range(len(src)):  # 1

        key = src[i] # 2

        j = i - 1 # 0
        while j >= 0 and key < src[j]:
            src[j + 1] = src[j]
            j -= 1
        src[j + 1] = key

# 2. 给定两个列表[1,2,3],['a','b','c'],不使用中间变量，交换两个列表前后的值，得到最终结果['a',2,'c'],[1,'b',3]
def list_change(src1,src2):
    src1[0],src2[0] = src2[0],src1[0]
    src1[-1], src2[-1] = src2[-1], src1[-1]

    return src1,src2


src1,src2 = [1,2,3],['a','b','c']

print(list_change(src1,src2))

# 这道题目考察的就是列表的索引以及对象的赋值。
# 可以尝试将函数里的两行并成一行。